package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: 变量的使用、exec方式、调用函数
 */
public class AviatorExecutor02 {

    public static void main(String[] args) {
        /**
         * 变量的使用
         */
        /* 变量参数 */
        String name = "LitchiShell";

        /* 参数封装 */
        Map<String, Object> env = new HashMap<>();
        env.put("name", name);

        /* 表达式中的name是一个变量, 默认为null, 通过传入Map<String,Object>的变量绑定环境, 将name设置为你输入的名称。
        env 的key是变量名, value是变量的值。*/
        String result = (String) AviatorEvaluator.execute("'Hello ' + name", env);

        /* 上面例子中的'hello '是一个Aviator的String, Aviator的String是任何用单引号或者双引号括起来的字符序列,
        String可以比较大小(基于unicode顺序), 可以参与正则匹配, 可以与任何对象相加, 任何对象与String相加结果为String。
        String中也可以有转义字符,如\n、\\、\' 等。 */
        AviatorEvaluator.execute(" 'a\"b' ");           // 字符串 a"b
        AviatorEvaluator.execute(" \"a\'b\" ");         // 字符串 a'b
        AviatorEvaluator.execute(" 'hello ' + 3 ");     // 字符串 hello 3
        AviatorEvaluator.execute(" 'hello '+ unknow "); // 字符串 hello null

        /**
         * exec方法：Aviator 2.2 开始新增加一个exec方法, 可以更方便地传入变量并执行, 而不需要构造env这个map了；
         * 只要在exec中按照变量在表达式中的出现顺序传入变量值就可以执行, 不需要构建Map了。
         */
        String newName = "Bill";
        String result2 = (String) AviatorEvaluator.exec("'Hello ' + name", newName);

        /**
         * 调用函数：Aviator 支持函数调用, 函数调用的风格类似 lua
         */
        Long result3 = (Long) AviatorEvaluator.execute("string.length('hello')");

        boolean result4 = (boolean) AviatorEvaluator.execute("string.contains(\"test\", string.substring('hello', 1, 2))");

        /* 结果输出 */
        System.out.println(result); //Hello LitchiShell
        System.out.println(result2); //Hello Bill
        System.out.println(result3); //5
        System.out.println(result4); //true
    }
}
